home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / tree / SwitchStatement.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  4.6 KB  |  187 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.asm.Label;
  7. import sun.tools.asm.SwitchData;
  8. import sun.tools.java.Environment;
  9. import sun.tools.java.Type;
  10.  
  11. public class SwitchStatement extends Statement {
  12.    Expression expr;
  13.    Statement[] args;
  14.  
  15.    public SwitchStatement(int var1, Expression var2, Statement[] var3) {
  16.       super(95, var1);
  17.       this.expr = var2;
  18.       this.args = var3;
  19.    }
  20.  
  21.    long check(Environment var1, Context var2, long var3, Hashtable var5) {
  22.       CheckContext var6 = new CheckContext(var2, this);
  23.       var3 = this.expr.checkValue(var1, var6, ((Statement)this).reach(var1, var3), var5);
  24.       Type var7 = this.expr.type;
  25.       this.expr = ((Node)this).convert(var1, var6, Type.tInt, this.expr);
  26.       Hashtable var8 = new Hashtable();
  27.       boolean var9 = false;
  28.       long var10 = var3;
  29.  
  30.       for(int var12 = 0; var12 < this.args.length; ++var12) {
  31.          Statement var13 = this.args[var12];
  32.          if (var13.op == 96) {
  33.             var10 = var13.check(var1, var6, var3, var5);
  34.             Expression var14 = ((CaseStatement)var13).expr;
  35.             if (var14 != null) {
  36.                if (var14 instanceof IntegerExpression) {
  37.                   Integer var15 = (Integer)((IntegerExpression)var14).getValue();
  38.                   int var16 = var15;
  39.                   if (var8.get(var14) != null) {
  40.                      var1.error(var13.where, "duplicate.label", var15);
  41.                   } else {
  42.                      var8.put(var14, var13);
  43.                      boolean var17;
  44.                      switch (var7.getTypeCode()) {
  45.                         case 1:
  46.                            var17 = var16 != (byte)var16;
  47.                            break;
  48.                         case 2:
  49.                            var17 = var16 != (char)var16;
  50.                            break;
  51.                         case 3:
  52.                            var17 = var16 != (short)var16;
  53.                            break;
  54.                         default:
  55.                            var17 = false;
  56.                      }
  57.  
  58.                      if (var17) {
  59.                         var1.error(var13.where, "switch.overflow", var15, var7);
  60.                      }
  61.                   }
  62.                } else {
  63.                   var1.error(var13.where, "const.expr.required");
  64.                }
  65.             } else {
  66.                if (var9) {
  67.                   var1.error(var13.where, "duplicate.default");
  68.                }
  69.  
  70.                var9 = true;
  71.             }
  72.          } else {
  73.             var10 = var13.check(var1, var6, var10, var5);
  74.          }
  75.       }
  76.  
  77.       if ((var10 & Statement.DEAD_END) == 0L) {
  78.          var6.vsBreak &= var10;
  79.       }
  80.  
  81.       if (var9) {
  82.          var3 = var6.vsBreak;
  83.       }
  84.  
  85.       return var2.removeAdditionalVars(var3);
  86.    }
  87.  
  88.    public Statement inline(Environment var1, Context var2) {
  89.       var2 = new Context(var2, this);
  90.       this.expr = this.expr.inlineValue(var1, var2);
  91.  
  92.       for(int var3 = 0; var3 < this.args.length; ++var3) {
  93.          if (this.args[var3] != null) {
  94.             this.args[var3] = this.args[var3].inline(var1, var2);
  95.          }
  96.       }
  97.  
  98.       return this;
  99.    }
  100.  
  101.    public Statement copyInline(Context var1, boolean var2) {
  102.       SwitchStatement var3 = (SwitchStatement)((Node)this).clone();
  103.       this.expr = this.expr.copyInline(var1);
  104.       var3.args = new Statement[this.args.length];
  105.  
  106.       for(int var4 = 0; var4 < this.args.length; ++var4) {
  107.          if (this.args[var4] != null) {
  108.             var3.args[var4] = this.args[var4].copyInline(var1, var2);
  109.          }
  110.       }
  111.  
  112.       return var3;
  113.    }
  114.  
  115.    public int costInline(int var1) {
  116.       int var2 = this.expr.costInline(var1);
  117.  
  118.       for(int var3 = 0; var3 < this.args.length && var2 < var1; ++var3) {
  119.          if (this.args[var3] != null) {
  120.             var2 += this.args[var3].costInline(var1);
  121.          }
  122.       }
  123.  
  124.       return var2;
  125.    }
  126.  
  127.    public void code(Environment var1, Context var2, Assembler var3) {
  128.       CodeContext var4 = new CodeContext(var2, this);
  129.       this.expr.codeValue(var1, var4, var3);
  130.       SwitchData var5 = new SwitchData();
  131.       boolean var6 = false;
  132.  
  133.       for(int var7 = 0; var7 < this.args.length; ++var7) {
  134.          Statement var8 = this.args[var7];
  135.          if (var8 != null && var8.op == 96) {
  136.             Expression var9 = ((CaseStatement)var8).expr;
  137.             if (var9 != null) {
  138.                var5.add(((IntegerExpression)var9).value, new Label());
  139.             }
  140.          }
  141.       }
  142.  
  143.       var3.add(super.where, 170, var5);
  144.  
  145.       for(int var11 = 0; var11 < this.args.length; ++var11) {
  146.          Statement var12 = this.args[var11];
  147.          if (var12 != null) {
  148.             if (var12.op == 96) {
  149.                Expression var10 = ((CaseStatement)var12).expr;
  150.                if (var10 != null) {
  151.                   var3.add(var5.get(((IntegerExpression)var10).value));
  152.                } else {
  153.                   var3.add(var5.getDefaultLabel());
  154.                   var6 = true;
  155.                }
  156.             } else {
  157.                var12.code(var1, var4, var3);
  158.             }
  159.          }
  160.       }
  161.  
  162.       if (!var6) {
  163.          var3.add(var5.getDefaultLabel());
  164.       }
  165.  
  166.       var3.add(var4.breakLabel);
  167.    }
  168.  
  169.    public void print(PrintStream var1, int var2) {
  170.       super.print(var1, var2);
  171.       var1.print("switch (");
  172.       this.expr.print(var1);
  173.       var1.print(") {\n");
  174.  
  175.       for(int var3 = 0; var3 < this.args.length; ++var3) {
  176.          if (this.args[var3] != null) {
  177.             ((Statement)this).printIndent(var1, var2 + 1);
  178.             this.args[var3].print(var1, var2 + 1);
  179.             var1.print("\n");
  180.          }
  181.       }
  182.  
  183.       ((Statement)this).printIndent(var1, var2);
  184.       var1.print("}");
  185.    }
  186. }
  187.